home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / ovl20.arc / OVL.DOC < prev    next >
Text File  |  1988-03-11  |  24KB  |  582 lines

  1.                        OVL 2.0 DOCUMENTATION
  2.                        ---------------------
  3.  
  4.  
  5.  
  6. LICENSE AND WARRANTY
  7. --------------------
  8.  
  9. OVL is copyright (C) 1988 by Michael E. Devore
  10.  
  11. The copyright holder licenses you to copy and distribute OVL for
  12. yourself and others subject to the following three restrictions:
  13.  
  14. 1.  OVL must be copied and distributed only in its original,
  15.     unmodified form.  This includes the executable,
  16.     documentation, and all example files.
  17.  
  18. 2.  No fee or other compensation can be charged for copying or
  19.     distributing the program.  User groups and public domain
  20.     software distributors MAY charge a handling fee for its
  21.     distribution NOT TO EXCEED $7.00 PER COPY.  ONLY ONE COPY
  22.     PER DISK IS ALLOWED FOR SUCH DISTRIBUTION.
  23.  
  24. 3.  OVL may NOT be distributed in combination with any other
  25.     products, software or hardware, without the express written
  26.     permission of Michael E. Devore.
  27.  
  28. There is no warranty of any kind with OVL and the copyright
  29. holder is not liable for any damages of any nature that may occur
  30. due to use of this software.  By using OVL, you agree to these
  31. terms.
  32.  
  33. It is the copyright holder's goal to fix any errors in OVL and
  34. to allow its distribution free of charge.  The copyright holder,
  35. however, is NOT LEGALLY OBLIGATED TO DO SO.
  36.  
  37. This document copyright (C) 1988, Michael E. Devore.  All rights
  38. reserved.
  39.  
  40.  
  41. ------------------------------------------------------------------------------
  42. ------------------------------------------------------------------------------
  43.  
  44.  
  45. OVL FILES
  46. ---------
  47.  
  48. Included in OVL.ARC should be the following files:
  49.  
  50. OVL.EXE             (OVL executable program)
  51. OVL.DOC             (OVL documentation file)
  52.  
  53. MASMTEST.ASM        (MASM example files)
  54. MASMTEST.OBJ
  55. OV1.ASM
  56. OV1.OBJ
  57. OV2.ASM
  58. OV2.OBJ
  59. OV3.ASM
  60. OV3.OBJ
  61.  
  62. COW.C               (Turbo C example files)
  63. COW.OBJ
  64. FARM.C
  65. FARM.OBJ
  66. HORSE.C
  67. HORSE.OBJ
  68. PIG.C
  69. PIG.OBJ
  70. PIGLET.C
  71. PIGLET.OBJ
  72. SHEEP.C
  73. SHEEP.OBJ
  74.  
  75. QBNEST.BAS          (QuickBASIC 4.0 example files)
  76. QBNEST.OBJ
  77. BNEST1.BAS
  78. BNEST1.OBJ
  79. BNEST2.BAS
  80. BNEST2.OBJ
  81. BNEST3.BAS
  82. BNEST3.OBJ
  83. BNEST4.BAS
  84. BNEST4.OBJ
  85.  
  86. QB4MOD.OBJ          (Object module required for QuickBASIC 4.0 programs)
  87.  
  88.  
  89. ------------------------------------------------------------------------------
  90. ------------------------------------------------------------------------------
  91.  
  92.  
  93. What is OVL?
  94. ------------
  95.  
  96. OVL is an overlay manager.  But what is an overlay manager and
  97. what good is it?  To answer that question we first need a little
  98. background on what overlays are and why they are useful.
  99.  
  100. Overlays are portions of your program code which are loaded from
  101. disk into memory on an as-needed basis.
  102.  
  103. Use of overlays allows an extremely large (potentially equal to
  104. hard disk size) program to run in a much smaller amount of
  105. memory.  Code from the program's .EXE file is brought in disk
  106. (overlaid) only when the program needs it.  Since all overlays
  107. share the same memory space, the memory requirements can be much
  108. less than the total code size of the program.  Also, there is no
  109. longer a need for the messy chaining, spawning, or exec'ing to
  110. another .EXE file that some languages require.
  111.  
  112. There is a tradeoff for these advantages.  The tradeoff is the
  113. time and code overhead necessary to read overlays in from disk.
  114. If you make the decision to use overlays with your program, any
  115. timing critical code should not be divided between overlays.
  116. For most applications, though, the relatively small amount of
  117. time it takes to read in an overlay is not important if
  118. transfers to overlays are not overdone.  Constant shuttling
  119. between overlays is an exercise guaranteed to give disappointing
  120. results.
  121.  
  122. LINK versions 3.x from Microsoft allow creation of overlaid
  123. versions of programs.  However, LINK only sets up the calls to
  124. the overlays.  It doesn't generate the actual code that loads
  125. the proper overlay from disk and passes control to it.  That's
  126. where OVL comes in.
  127.  
  128. OVL "manages" overlays.  It loads them in from disk at the
  129. appropriate time and jumps program execution to the overlay
  130. code.
  131.  
  132. To use OVL, first link your program with overlays using
  133. Microsoft's LINK.  Your LINK documentation should show you how
  134. to do this.  If not, or you don't completely understand the LINK
  135. documentation, study the examples in the 'USING OVL' section
  136. later in this document.  Also, if you are using QuickBASIC 4.0,
  137. you will need to link in the included object module QB4MOD.OBJ
  138. as the first object file.
  139.  
  140. After you have linked a program with overlays, type OVL <program
  141. name>.  OVL will begin execution, controlling the loading and
  142. overlay management of your program.  If the program loaded by
  143. OVL has command line parameters, these will be properly passed
  144. to the loaded program.  If, for example, you had a program
  145. containing overlays named MYPROG that used the command line
  146. switch /B to make it beep, you could type OVL MYPROG /B and it
  147. would work correctly.  Note that typing the .EXE extension of a
  148. program is optional.
  149.  
  150.  
  151. ------------------------------------------------------------------------------
  152. ------------------------------------------------------------------------------
  153.  
  154.  
  155. OVL SPECIFICATIONS AND REQUIREMENTS
  156. -----------------------------------
  157.  
  158. OVL requires an IBM PC or PS/2 microcomputer or close compatible
  159. that runs MS-DOS or PC-DOS 2.1 or later.
  160.  
  161. OVL requires 16K memory when in use.  This is in addition to
  162. whatever memory your program requires.
  163.  
  164. OVL has only been tested with MASM, Turbo C, and QuickBASIC 4.0.
  165. Use of OVL with QuickBASIC 4.0 requires linking in an additional
  166. object module (QB4MOD.OBJ) as the first object file and
  167. compiling using the /o option of BC.EXE.  It is probable, but
  168. not known for fact, that OVL will work with ALL languages that
  169. compile to Microsoft LINKable object modules.  Microsoft or
  170. other languages may --  QuickBASIC 4.0 does -- require the
  171. presence of an additional object module to operate correctly.
  172. The object files created by versions of QuickBASIC earlier than
  173. 4.0 abort with an error if an link is attempted with overlays.
  174. Therefore, OVL will not work with versions of QuickBASIC earlier
  175. than 4.0.
  176.  
  177. OVL requires at least one overlay in your program.  It will
  178. abort with an "Invalid overlay information." error if none
  179. exist.
  180.  
  181. OVL has a current limit of eight overlays.  More than eight
  182. overlays will cause OVL to abort with a "Too many overlays."
  183. error.  PROVL, the enhanced version of OVL, has a limit of 63
  184. overlays -- LINK's maximum.
  185.  
  186. OVL support calls from one overlay to another.  The depth to
  187. which overlays can be nested cannot exceed four levels.  If an
  188. attempt is made to nest deeper than four overlays, OVL will
  189. abort with a "Overlays nested deeper than 4 levels." error.
  190. PROVL supports a nesting depth of 32 levels.
  191.  
  192. OVL requires use of the Microsoft LINK default overlay interrupt
  193. 63 (3fh).  Do not use the /o option of LINK to change the
  194. overlay manager interrupt.  PROVL supports changing the default
  195. overlay manager interrupt via the /o option of LINK.
  196.  
  197. OVL may not work with other non-default LINK parameters.  For
  198. instance, the /E option will not work with OVL.  There may be
  199. others.
  200.  
  201. OVL should not be used to execute memory resident programs.
  202.  
  203. OVL fully supports and uses the PATH= environment variable when
  204. searching for the program to execute.  However, after OVL has
  205. located the program, the program should not be moved from the
  206. drive and directory where it was found.  Otherwise, OVL will
  207. abort with a "File not found." error when it attempts to load an
  208. overlay from disk.
  209.  
  210. This version of OVL WILL work with overlay .EXE files that have
  211. any LINK-allowed number of relocation entries (up 32K).  If you
  212. don't know what a relocation entry is, don't worry about it.
  213. OVL will work just the same.
  214.  
  215.  
  216. ------------------------------------------------------------------------------
  217. ------------------------------------------------------------------------------
  218.  
  219.  
  220. USING OVL
  221. --------- 
  222.  
  223. To demonstrate how to use LINK to set up overlays, there are
  224. three sets of sample programs included in the OVL files.  One
  225. set is written using MASM 5.0, another using Turbo C 1.5, and
  226. the third using QuickBASIC 4.0.  Both source and .obj files have
  227. been included.
  228.  
  229. As stated in the LINK documentation, you MUST compile under a
  230. large code model for programs to work correctly with overlays.
  231. For MASM 5.0, this means you must compile using .MODEL MEDIUM
  232. (far-code, near-data), .MODEL LARGE (far-code, far-data), or
  233. .MODEL HUGE (far-code, far-data).  If you are using an earlier
  234. version of MASM, make sure that PUBLIC procedures are declared
  235. FAR.  For Turbo C version 1.0 and 1.5, compile your files under
  236. the medium, large, or huge model.  No compile model options are
  237. necessary for QuickBASIC, although you must use the /o option of
  238. BC.EXE for your program to work correctly.
  239.  
  240. The first example will use the assembly language .ASM files
  241. written using MASM 5.0.  Although the .MODEL LARGE is used for
  242. these example files, .MODEL MEDIUM and .MODEL HUGE should work
  243. in exactly the same fashion for overlaying purposes.
  244.  
  245. Link together the ASM .obj files, enclosing in parentheses the
  246. modules you want to be overlays.  Make sure that you use at
  247. least one overlay or OVL will not work with the file.  If, for
  248. instance you link in this manner:
  249.  
  250.      link masmtest+(ov1+ov2)+(ov3);
  251.  
  252. a main .EXE file called MASMTEST.EXE will be created.  This
  253. MASMTEST.EXE file will contain the root .EXE file MASMTEST
  254. comprised of the code of the MASMTEST object module and will
  255. also contain two overlay files.  One overlay file will contain
  256. the code of the OV1 and OV2 modules, the other will contain the
  257. code of OV3.
  258.  
  259. To run the MASMTEST.EXE FILE created from the link, type OVL
  260. MASMTEST.  You may haved noted from the OV1.ASM file that the
  261. OV1 module calls a routine in the root module.  Since the root
  262. is always in memory, the call is coded normally by LINK and no
  263. special overlay instructions are required.  This is an important
  264. point to remember about overlays:  THERE IS NO SPEED OR CODE
  265. PENALTY INVOLVED IN CALLING ROUTINES FROM A LOADED OVERLAY TO
  266. THE ROOT CODE OR FROM ONE OBJECT MODULE TO ANOTHER WITHIN THE
  267. SAME OVERLAY.
  268.  
  269. The amount of memory required to load the MASMTEST.EXE file you
  270. created, or any file created by LINK using overlays, is equal to
  271. the size of the root file plus the size of the largest overlay
  272. file plus any program overhead and dynamic memory allocations
  273. made by the program plus 16K for OVL.  Obviously, there is no
  274. advantage to only using one overlay in a program since space
  275. must be allocated for it in memory during program execution
  276. anyway.  There is only the disadvantage of the overlay overhead.
  277.  
  278. Another example of linking using overlays would be:
  279.  
  280.      link masmtest+(ov1)+(ov2)+ov3;
  281.  
  282. Here there will be two overlay files containing the code of,
  283. respectively, OV1 and OV2, and a root file containing the
  284. MASMTEST and OV3 code.
  285.  
  286. The only overlay combination not allowed by OVL is one where the
  287. MASMTEST object module is linked as an overlay.  Since MASMTEST
  288. contains the start up code it must be in memory from the very
  289. beginning.
  290.  
  291. The second set of files are examples using Turbo C.  To use
  292. them, you need to have the Turbo C compiler, since 'C' requires
  293. startup and library modules specific to the compiler.  OVL is
  294. put a little more to the test here because the code is larger,
  295. parameters are passed to the overlays and a command line
  296. argument can be passed.  Further, in one module, PIG.C, overlays
  297. can be nested if the 'piglet' function that is called from it is
  298. located in a different overlay module.
  299.  
  300. To create FARM.EXE with an overlay file containing the code of
  301. 'horse' and 'piglet' and an overlay file containing the code of
  302. 'cow', 'pig', and 'sheep' and a root containing the code of
  303. 'farm' and the start up code of 'c0m', you would link like this,
  304. assuming that the code has been compiled using the medium model:
  305.  
  306.      link c0m+farm+(horse+piglet)+(cow+pig+sheep),farm,nul,
  307.      emu+mathm+cm;
  308.  
  309. After you link the program, try running it by typing "OVL FARM"
  310. and "OVL FARM MACDONALD" to see the command line parameter in
  311. use.  All of the modules can be put in an overlay except for
  312. 'c0m' which contains the start up code.  Remember, you must use
  313. Microsoft's LINK when linking this or any other Turbo C program
  314. for use with OVL.  The copy of TLINK included with Turbo C does
  315. not support overlays.
  316.  
  317. The final set of examples are QuickBASIC 4.0 files.  There is an
  318. extra step involved in using QuickBASIC 4.0 programs with OVL.
  319. An extra object module called QB4MOD.OBJ must be linked in as
  320. the first object file during the link process.  So, to create a
  321. program called QBNEST.EXE with a root of QB4MOD and QBNEST, an
  322. overlay containing BNEST1 and BNEST2, an overlay containing
  323. BNEST4, and an overlay containing BNEST3, you would link in
  324. this fashion:
  325.  
  326.      link qb4mod+qbnest+(bnest1+bnest2)+(bnest4)+(bnest3),qbnest;
  327.  
  328. Because of the way QB4MOD is coded, it must be in the root with
  329. the main program.  In these example files, neither QB4MOD nor
  330. QBNEST can be in an overlay.
  331.  
  332. To use your own QuickBASIC 4.0 programs with overlays you should
  333. compile the files using BC.EXE.  Overlays will not work with the
  334. runtime file BRUN40.EXE, so the /o option must be used to
  335. compile QuickBASIC 4.0 programs.
  336.  
  337. Feel free to try any permutation of overlays allowed by these
  338. examples.  OVL should work with any of them, as long as you stay
  339. within the restrictions already outlined.  It is especially
  340. important to remember not to put the initial entry code in an
  341. overlay.  The start up code must be in memory when the program
  342. is first loaded, i.e. in the root code.
  343.  
  344. You may have noticed that these example files are all small
  345. enough to fit into memory without overlays.  How do you really
  346. know that OVL is bringing the overlays in as needed instead of
  347. sneaking everything in at once?
  348.  
  349. First, you can try running a file linked with overlays without
  350. OVL.  If you do this your computer will probably lock up and
  351. need to be turned off or reset before it can be used again.
  352. This is because your program is using interrupt 63 which OVL
  353. hasn't initialized to point to code that manages the overlays.
  354. So, your program tries to transfer control to whatever random
  355. address may be at interrupt 63.
  356.  
  357. The second test you can do is transfer OVL.EXE and the example
  358. .EXE file to a floppy and disable any disk caching.  Now run OVL
  359. off of the floppy drive.  You should see the floppy disk drive
  360. light come on during execution of the example program as
  361. overlays are loaded from disk.  For maximum effect, you may want
  362. to link the example program using as many overlays as possible.
  363.  
  364.  
  365. ------------------------------------------------------------------------------
  366. ------------------------------------------------------------------------------
  367.  
  368.  
  369. PROVL -- An Enhanced Version of OVL
  370. -----------------------------------
  371.  
  372. If you wish to sell a program that uses OVL to operate, or if
  373. you just want a more powerful version of OVL, an enhanced
  374. version of OVL called PROVL can be purchased for $45.  PROVL
  375. works with any overlay interrupt specified by the /o option of
  376. LINK, allows up to 63 overlays (LINK's maximum), and increases
  377. the depth that overlays can be nested to 32 levels.  PROVL also
  378. dispenses with the runtime copyright notice.  This does not
  379. imply that PROVL is not copyrighted.  A potentially distracting
  380. message is simply not displayed.  No royalties will be charged
  381. for use of PROVL.  This means that you need only purchase a
  382. single version of PROVL for use with your program no matter how
  383. many copies of your program you distribute.  Purchase of PROVL
  384. also entitles the purchaser to telephone support.  All calls
  385. will be at the purchaser's expense.
  386.  
  387. Note that purchase of PROVL is MANDATORY if you wish to use a
  388. version of OVL for distribution with a commercial or shareware
  389. program.  PROVL is the only version of the overlay manager
  390. permitted for such applications.
  391.  
  392. To purchase PROVL, send $45.00 by check or money order with your
  393. shipping address to:
  394.  
  395.     Michael E. Devore
  396.     Devore Software & Consulting
  397.     403 West Charles
  398.     Champaign, IL  61820
  399.  
  400. Please state your preference for either 5 1/4 or 3 1/2 inch
  401. diskettes.
  402.  
  403. All information contained herein, including the cost of PROVL,
  404. is subject to change without notice.
  405.  
  406. PROVL is copyright (C) 1988 by Michael E. Devore
  407.  
  408.  
  409. ------------------------------------------------------------------------------
  410. ------------------------------------------------------------------------------
  411.  
  412.  
  413. If OVL Doesn't Work Properly
  414. ----------------------------
  415.  
  416. First, make sure that you have compiled the language under a
  417. large code model, if applicable.  OVL will not work under a
  418. small code model.  Also, you should use a relatively recent
  419. version of LINK when linking overlays for OVL.  OVL was tested
  420. with LINK versions 3.06, 3.60 and 3.61.  2.x versions of LINK
  421. will not work.  The copyright notice of LINK must say Overlay
  422. Linker.  Turbo C's TLINK or other proprietary linkers will not
  423. work with OVL; you must use Microsoft's LINK.
  424.  
  425. QuickBASIC 4.0 users should check to make sure that they are
  426. linking in QB4MOD.OBJ as the first object file during link.
  427. Make sure that neither QB4MOD nor the main program is in an
  428. overlay.  Because of the highly specific nature of the
  429. QB4MOD.OBJ file, OVL may only work with version 4.0 of
  430. QuickBASIC and not later versions.  If this proves to be the
  431. case, contact me about an updated QB4MOD.OBJ file to allow use
  432. of OVL with later versions.
  433.  
  434. If you are sure that you are compiling and linking properly, try
  435. to make sure that the error is not in your program.  If memory
  436. size allows, compile your program without overlays and test it.
  437. If the size of your program is too large for it all of it to fit
  438. in memory, try to compile only the code that is giving you
  439. problems and see if it works correctly without overlays.
  440.  
  441. If your program still fails after you have eliminated all
  442. suspects except for OVL, please contact me so I can fix the
  443. problem as soon as possible.  However, I will need to know the
  444. circumstances.  What error message, if any, does OVL print?
  445. What version and options of LINK were used?  What language was
  446. the program written in?  If possible I would like to have a copy
  447. of the program that causes OVL to crash, executable copy at the
  448. least.
  449.  
  450. If the error is in OVL and you are the first person to find the
  451. error, I will send you a free corrected version as soon as it is
  452. available.  The corrected version will either be sent by e-mail
  453. if possible, or regular USPS mail if not.  If you are not the
  454. first person to find the error and cannot wait for the corrected
  455. version to reach general distribution channels, you may send
  456. $5.00 to cover shipping and handling for the latest version to
  457. the address below.
  458.  
  459. If you subscribe to either the CompuServe Information Service,
  460. or the GEnie Information Service, you can e-mail me at the
  461. appropriate e-mail address below.  I check in to both services
  462. at least once a week, usually more frequently.  Your e-mail will
  463. be acknowledged as soon as I receive it.
  464.  
  465. If you do not subscribe to either CompuServe or GEnie you should
  466. contact me through USPS mail at the address below:
  467.  
  468. MAILING ADDRESS:
  469.      Michael E. Devore
  470.      Devore Software & Consulting
  471.      403 W. Charles
  472.      Champaign, IL  61820
  473.  
  474. E-MAIL ADDRESSES:
  475.      CompuServe     71540,62
  476.      GEnie          MDEVORE
  477.  
  478.  
  479. ------------------------------------------------------------------------------
  480. ------------------------------------------------------------------------------
  481.  
  482.  
  483. OVERLAY TECHNICAL DOCUMENTATION
  484. -------------------------------
  485.  
  486. It is not necessary to read or understand this part of the OVL
  487. documentation to use OVL.  This technical documentation is
  488. included for those who wish to know more information about how
  489. overlay calls are set up by LINK.
  490.  
  491. When you link a program with overlays, LINK sets up calls to
  492. code in the overlays in a special way.  All of these calls are
  493. replaced with an interrupt.  By LINK default the interrupt is 63
  494. or 3f hexadecimal, although the interrupt can be changed using
  495. the /o or /overlayinterrupt LINK option.  Please note that
  496. changing the overlay interrupt in this fashion is not supported
  497. by OVL, and OVL will not work with a program linked using the
  498. non-default overlay interrupt.  PROVL, the enhanced version of
  499. OVL, does support changing the interrupt via the /o option of
  500. LINK.
  501.  
  502. Immediately following the interrupt inserted by LINK are three
  503. bytes of data.  The first byte is used by the overlay manager as
  504. an offset into an table found at the end of the root
  505. .EXE code that determines which overlay should be loaded into
  506. memory.  The second two bytes give the value that the
  507. Instruction Pointer (IP) should have when a jump to the overlay
  508. code is executed.  When the overlay manager is called by the
  509. interrupt, it needs to adjust the return address to point past
  510. these three bytes.
  511.  
  512. The remaining information that the overlay manager needs can be
  513. found at the end of the root .EXE file.  Note that an .EXE
  514. program with overlays appends the overlay .EXE files to the root
  515. .EXE file.  Each overlay file has its own header that matches
  516. the standard .EXE header, including items in the relocation
  517. table that need to be have fixups performed on them.  The
  518. information that the root .EXE has is as follows:
  519.  
  520.      1 word containing the count of all .obj modules used to
  521.      create the .EXE file (total of root plus all overlay
  522.      modules).
  523.  
  524.      1 word containing the total .EXE files in the main .EXE
  525.      file.  This will equal the number of overlay files plus one
  526.      for the root.
  527.  
  528.      1 zero word.
  529.  
  530.      A table with entries for each overlay that, when added to
  531.      the root program load segment, provide the value the Code
  532.      Segment (CS) should have when a jump to the overlay code is
  533.      executed.
  534.  
  535.      1 zero word.
  536.  
  537.      A table that uses the first byte following the interrupt in
  538.      the calling code for an offset.  The entries in the table
  539.      determine which overlay has the necessary code and should
  540.      be loaded in memory, if it isn't loaded already.
  541.  
  542.      Variable number of zero bytes.
  543.  
  544.      The name of the main .EXE file that has all of the overlay
  545.      files contained in it.
  546.  
  547.      Variable number of zero bytes.
  548.  
  549.      The interrupt used by the overlay manager.
  550.  
  551.  
  552. ------------------------------------------------------------------------------
  553. ------------------------------------------------------------------------------
  554.  
  555.  
  556. COMMENTS AND SUGGESTIONS
  557. ------------------------
  558.  
  559. If you have an idea for an improvement to OVL, a comment or
  560. question about OVL, or even a complaint about OVL, please send
  561. it to either my USPS mailing address or one of the e-mail
  562. addresses below.  I am receptive to new ideas and constructive
  563. criticism.  I would also be interested in what other languages
  564. OVL works with, e.g. Turbo BASIC, Turbo Prolog, or another 'C'
  565. compiler.
  566.  
  567. OVL began as a grass-roots solution to the problem of a low-cost
  568. overlay manager.  I hope to maintain that approach and never
  569. take on the arrogant traits exhibited by some software
  570. developers and mega-corporations.  With your help, I plan to
  571. keep OVL a viable, useful, low-cost alternative to overpriced
  572. software.
  573.  
  574.      Michael E. Devore
  575.      Devore Software & Consulting
  576.      403 W. Charles
  577.      Champaign, IL  61820
  578.  
  579.      CompuServe      71540,62
  580.      GEnie           MDEVORE
  581.  
  582.